package main

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"nhooyr.io/websocket"
	"nhooyr.io/websocket/wsjson"
	"time"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
		fmt.Fprintln(w, "HTTP, Hello") // 响应 HTTP 请求，返回"HTTP, Hello"
	})

	http.HandleFunc("/ws", func(w http.ResponseWriter, req *http.Request) {
		conn, err := websocket.Accept(w, req, nil) // 接受 WebSocket 连接请求
		if err != nil {
			log.Println(err)
			return
		}
		defer conn.Close(websocket.StatusInternalError, "内部出错了！") // 在函数返回之前关闭 WebSocket 连接并发送关闭消息

		ctx, cancel := context.WithTimeout(req.Context(), time.Second*10) // 创建带有 10 秒超时的上下文
		defer cancel()

		var v interface{}
		err = wsjson.Read(ctx, conn, &v) // 读取来自 WebSocket 客户端的消息
		if err != nil {
			log.Println(err)
			return
		}
		log.Printf("接收到客户端：%v\n", v) // 打印接收到的消息

		err = wsjson.Write(ctx, conn, "Hello WebSocket Client") // 向 WebSocket 客户端发送消息
		if err != nil {
			log.Println(err)
			return
		}

		conn.Close(websocket.StatusNormalClosure, "") // 在函数返回之前关闭 WebSocket 连接并发送关闭消息
	})

	log.Fatal(http.ListenAndServe(":2021", nil)) // 启动 HTTP 服务器，监听端口 2021，如果启动失败则打印错误信息并退出程序
}
